package algo3.algothief.modelo;

import org.w3c.dom.Document;
import org.w3c.dom.Element;


public class Reloj {
	
	private String[] dias;
	
	private String diaActual;
	private Integer horaActual;
	
//-------------------------------------------------------------------------------------	
	
	public Reloj(String dia, int hora) {
		crearDiasDeLaSemana();
		
		this.diaActual = dia;
		
		this.horaActual = hora;
	}
	
//-------------------------------------------------------------------------------------

	public Element serializar(Document doc) {
		Element elementoReloj = doc.createElement("Reloj");
			
		Element elementoDia = doc.createElement("DiaActual");
		Element elementoHora = doc.createElement("HoraActual");
		elementoDia.setAttribute("dia", diaActual);
		elementoHora.setAttribute("hora", horaActual.toString());
		
		elementoReloj.appendChild(elementoDia);
		elementoReloj.appendChild(elementoHora);
					
		return elementoReloj;
	}
		
	public static Reloj hidratar(Document doc) {
		Element elementoReloj = (Element)doc.getElementsByTagName("Reloj").item(0);
			
		Element elementoDia = (Element)elementoReloj.getElementsByTagName("DiaActual").item(0);
		String diaNuevo = elementoDia.getAttribute("dia");
			
		Element elementoHora = (Element)elementoReloj.getElementsByTagName("HoraActual").item(0);
		String horaNuevaEnFormaDeString = elementoHora.getAttribute("hora");
		int horaNueva = Integer.parseInt(horaNuevaEnFormaDeString);
		
		Reloj relojNuevo = new Reloj(diaNuevo, horaNueva);
		
		return relojNuevo;
	}
	
//-------------------------------------------------------------------------------------
	
	private void crearDiasDeLaSemana() {
		String[] diasDeLaSemana = { 
			"Lunes","Martes","Miercoles","Jueves","Viernes","Sabado","Domingo"
		};
		
		this.dias = diasDeLaSemana;
	}
	
	private int buscarDia(String dia) {
		int indiceDia = -1;
		
		for (int i = 0; ( (indiceDia == -1) && (i < 7) ); i++) 
			if (dias[i].matches(dia)) indiceDia = i;
		
		return indiceDia;
	}
	
	
	private void avanzarDias(int dias) {
		if (dias != 0) {
			int fechaActual = this.buscarDia(diaActual);
		
			if ((fechaActual + dias) <= 6) {
				fechaActual += dias;
				this.diaActual = this.dias[fechaActual];
			}
			else {
				int diasExtra = (int)( (fechaActual + dias) / 7 ); 
				if (diasExtra != 1) this.avanzarDias(diasExtra);
			
				fechaActual = (int)( (fechaActual + dias) % 7 );
				this.diaActual = this.dias[fechaActual];
			}
		}
	}
	
	private void avanzarHoras(int horas) {
		if (horas != 0) {
			if ((horaActual + horas) <= 23) 
				horaActual += horas;
			else {
				int diasExtra = (int)( (horaActual + horas) / 24 );
				this.avanzarDias(diasExtra);
			
				this.horaActual = (int)( (horaActual + horas) % 24 );
			}
		}
	}
	
//-------------------------------------------------------------------------------------	
	
	public String[] verDiasDeLaSemana() {
		return this.dias;
	}
	
	public Object[] verFechaYHora() {
		Object[] fechaYHora = { diaActual, horaActual };
		return fechaYHora;
	}
	
	
	public boolean verSiEsDeNoche() {
		return (horaActual == 0);
	}
	
	
	public void avanzarTiempo(int dias, int horas) {
		avanzarDias(dias);
		avanzarHoras(horas);
	}
}
